// 类型断言
// 值 as 类型　　value as string
// <类型>值   <string>value

// interface A {
//   run: string
// }

// interface B {
//   build: string
// }

// const fn1 = (type: A | B): string => {
//   return type.run
// }
//这样写是有警告的应为B的接口上面是没有定义run这个属性的

interface A {
  run: string
}

interface B {
  build: string
}

const fn2 = (type: A | B): string => {
  return (type as A).run
}
//可以使用类型断言来推断他传入的是A接口的值

// 使用any临时断言
// window.abc = 123
//这样写会报错因为window没有abc这个东西

(window as any).abc = 123
//可以使用any临时断言在 any 类型的变量上，访问任何属性都是允许的。

// as const
// 是对字面值的断言，与const直接定义常量是有区别的

// 如果是普通类型跟直接const 声明是一样的
// const names = '小满'
// names = 'aa' //无法修改
 
// let names2 = '小满' as const
// names2 = 'aa' //无法修改

// 数组
let a1 = [10, 20] as const;
const a2 = [10, 20];
 
// a1.unshift(30); // 错误，此时已经断言字面量为[10, 20],数据无法做任何修改
a2.unshift(30); // 通过，没有修改指针

// 类型断言是不具影响力的
// 在下面的例子中，将 something 断言为 boolean 虽然可以通过编译，但是并没有什么用 并不会影响结果, 因为编译过程中会删除类型断言
function toBoolean(something: any): boolean {
  return something as boolean;
}

toBoolean(1);
// 返回值为 1
//

let xA:any = 'ho there'
// x表示任何类型，编译器不能明确知道x是哪种类型
// <string> 表示 x 断言成字符串类型，就是告诉编译器x是字符串类型，这样就可以调用substring函数，因为字符串才有这个函数。
// let xs1=(<string>xA).substring(0, 5)
let xs =( xA as string).substring(0, 5)
console.log(xs)



